package cn.xingzhe.monster.user.domain.model;

import lombok.Builder;
import lombok.Getter;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.UUID;

/**
 * 权限领域模型
 * 包含权限相关的业务逻辑和业务规则
 *
 * @author System
 * @version 1.0.0
 * @since 2024-01-01
 */
@Getter
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class PermissionModel {

    /**
     * 权限ID
     */
    private String id;

    /**
     * 权限代码（唯一，格式：资源:操作，如 user:create）
     */
    private String permissionCode;

    /**
     * 权限名称
     */
    private String permissionName;

    /**
     * 资源
     */
    private String resource;

    /**
     * 操作
     */
    private String action;

    /**
     * 权限描述
     */
    private String description;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 创建权限
     *
     * @param permissionCode 权限代码（格式：资源:操作）
     * @param permissionName 权限名称
     * @param resource       资源
     * @param action         操作
     * @param description    权限描述
     * @return 权限领域模型
     */
    public static PermissionModel create(String permissionCode, String permissionName,
                                         String resource, String action, String description) {
        validatePermissionCode(permissionCode);
        LocalDateTime now = LocalDateTime.now();
        return PermissionModel.builder()
                .id(UUID.randomUUID().toString())
                .permissionCode(permissionCode)
                .permissionName(permissionName)
                .resource(resource)
                .action(action)
                .description(description)
                .createTime(now)
                .updateTime(now)
                .build();
    }

    /**
     * 从权限代码解析资源和服务
     *
     * @param permissionCode 权限代码
     * @return 权限领域模型（仅包含解析后的资源和服务）
     */
    public static PermissionModel parseFromCode(String permissionCode) {
        validatePermissionCode(permissionCode);
        String[] parts = permissionCode.split(":");
        if (parts.length != 2) {
            throw new IllegalArgumentException("权限代码格式不正确，应为：资源:操作");
        }
        return PermissionModel.builder()
                .permissionCode(permissionCode)
                .resource(parts[0])
                .action(parts[1])
                .build();
    }

    /**
     * 更新权限信息
     *
     * @param permissionName 权限名称
     * @param description     权限描述
     * @return 新的权限模型
     */
    public PermissionModel updateInfo(String permissionName, String description) {
        return this.toBuilder()
                .permissionName(permissionName != null ? permissionName : this.permissionName)
                .description(description != null ? description : this.description)
                .updateTime(LocalDateTime.now())
                .build();
    }

    /**
     * 验证权限代码格式
     *
     * @param permissionCode 权限代码
     */
    private static void validatePermissionCode(String permissionCode) {
        if (permissionCode == null || permissionCode.trim().isEmpty()) {
            throw new IllegalArgumentException("权限代码不能为空");
        }
        if (!permissionCode.matches("^[a-z0-9_]+:[a-z0-9_]+$")) {
            throw new IllegalArgumentException("权限代码格式不正确，应为：资源:操作（只能包含小写字母、数字和下划线）");
        }
    }

}

